import time
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
import pandas as pd
import tkinter as tk
from tkView import TkWin
import sys
from selenium.webdriver.common.by import By

class WebAutomation:
    def __init__(self, t):
        # 初始化提示
        self.tk_win = TkWin(t)
        self.driver = None

    def start_browser(self):
        """启动浏览器并打开指定网页"""
        service = Service(ChromeDriverManager().install())
        self.driver = webdriver.Chrome(service=service)

    def open_page(self, url):
        """打开指定的网页"""
        if self.driver:
            self.driver.get(url)
        else:
            print("浏览器尚未启动，请先调用 start_browser() 方法。")

    def close_browser(self):
        """关闭浏览器"""
        if self.driver:
            self.driver.quit()
        else:
            print("浏览器尚未启动，无法关闭。")

    def start(self):
        """开始自动化流程"""
        xlsx_path = self.tk_win.select_file()  # 选择 Excel 文件
        if xlsx_path:
            try:
                self.xlsx_data = self.read_xlsx(xlsx_path)  # 读取 Excel 文件
                if len(self.xlsx_data) == 0:
                    self.tk_win.show_info('提示', '未读取到有效表格数据')
                    time.sleep(1)
                    self.tk_win.close_table()
                    self.start()  # 重新开始选择文件
                    return
                self.tk_win.show_table(self.xlsx_data, callback=self.get_confirmation)
            except Exception as e:
                print("错误处理", e)

    def get_confirmation(self, confirmed):
        """获取确认状态"""
        print("确认状态:", confirmed)
        if not confirmed:
            sys.exit()  # 退出程序
            return
        self.tk_win.close_table()
        time.sleep(1)

        # 确认后执行自动化表单填写
        self.iterate_and_submit()

    def read_xlsx(self, file_path):
        """读取指定xlsx文件的A到E列，从第二行开始"""
        try:
            # 使用pandas读取xlsx文件
            df = pd.read_excel(file_path, usecols='A:E', skiprows=0)  # 跳过第一行
            data = df.values.tolist()  # 转换为列表
            self.xlsx_data = data  # 存储当前表格数据
            return data
        except Exception as e:
            print(f"读取文件时出错: {e}")
            self.tk_win.show_error('提示', "读取错误，请检查xlsx文件格式是否正确")
            return []

    def fill_form(self, product, index):
        print('我的下表', index)
        """自动填写表单"""
        try:
            # 查找表单元素并填写数据
            name_input = self.driver.find_element(By.ID, f'name{index + 1}')
            price_input = self.driver.find_element(By.ID, f'price{index + 1}')
            commission_input = self.driver.find_element(By.ID, f'commission{index + 1}')
            description_input = self.driver.find_element(By.ID, f'description{index + 1}')
            image_input = self.driver.find_element(By.ID, f'image{index + 1}')

            # 填充表单字段
            name_input.send_keys(product[0])  # 商品名称
            price_input.send_keys(str(product[1]))  # 价格
            commission_input.send_keys(str(product[2]))  # 佣金
            description_input.send_keys(product[3])  # 商品介绍
            image_input.send_keys(product[4])  # 图片地址
            time.sleep(1)
        except Exception as e:
            print(f"自动填充表单时发生错误: {e}")

    def iterate_and_submit(self):
        """遍历商品数据并自动提交多个表单"""
        # 打开目标网页
        self.open_page('http://127.0.0.1:5500/1.html')  # 替换为实际表单 URL

        for idx, product in enumerate(self.xlsx_data):
            print(f"正在添加商品: {product}")
            # 调用 fill_form 来填写单个表单
            self.fill_form(product, idx)

            # 如果需要添加多条商品表单，可以点击“添加商品”按钮（假设按钮存在）
            if idx < len(self.xlsx_data) - 1:
                try:
                    add_product_button = self.driver.find_element(By.XPATH, '//*[@id="productForm"]/a')  # 根据页面结构调整
                    add_product_button.click()  # 点击“添加商品”按钮，生成新的表单条目
                    time.sleep(1)  # 等待新表单生成
                except Exception as e:
                    print(f"添加商品按钮点击失败: {e}")

        # 最后统一提交表单
        try:
            submit_button = self.driver.find_element(By.XPATH, '//button[text()="提交"]')
            submit_button.click()  # 提交所有商品表单
            print("表单提交成功")
            time.sleep(2)  # 等待页面处理提交

            # 提交完成后保持浏览器打开
            print("浏览器保持打开状态，可以手动关闭。")
        except Exception as e:
            print(f"提交表单时出错: {e}")


# 使用示例
if __name__ == "__main__":
    root = tk.Tk()
    automation = WebAutomation(root)

    # 启动浏览器
    automation.start_browser()

    # 选择xlsx文件并自动执行表单填写
    automation.start()
